package com.boomsecret.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.SortingParams;
import redis.clients.util.SafeEncoder;

import java.util.List;
import java.util.Set;

/**
 * Created by wangjinliang on 2018/1/22.
 * 操作Key的方法
 */
public final class RedisKeyUtils {

    private RedisKeyUtils() {}

    private static Jedis getJedis() {
        return RedisUtils.getJedis();
    }

    private static void releaseJedis(Jedis jedis) {
        RedisUtils.releaseJedis(jedis);
    }

    /**
     * 清空所有Key
     */
    public static String flushAll() {
        Jedis jedis = getJedis();
        String state = jedis.flushAll();
        releaseJedis(jedis);
        return state;
    }

    /**
     * 更改key
     * @return 状态码
     */
    public static String rename(String oldKey, String newKey) {
        return rename(SafeEncoder.encode(oldKey), SafeEncoder.encode(newKey));
    }

    /**
     * 更改key
     * @return 状态码
     */
    public static String rename(byte[] oldKey, byte[] newKey) {
        Jedis jedis = getJedis();
        String status = jedis.rename(oldKey, newKey);
        releaseJedis(jedis);
        return status;
    }

    /**
     * 更改key, 仅当新key不存在时才执行
     * @return 状态码
     */
    public static long renamenx(String oldKey, String newKey) {
        Jedis jedis = getJedis();
        long status = jedis.renamenx(oldKey, newKey);
        releaseJedis(jedis);
        return status;
    }

    /**
     * 设置key的过期时间, 以秒为单位
     * @return 影响的记录数
     */
    public static long expired(String key, int seconds) {
        Jedis jedis = getJedis();
        long count = jedis.expire(key, seconds);
        releaseJedis(jedis);
        return count;
    }

    /**
     * 设置key的过期时间, 单位秒[它是距历元（即格林威治标准时间 1970 年 1 月 1 日的 00:00:00，格里高利历）的偏移量]
     * @return 影响的记录数
     */
    public static long expiredAt(String key, long unixTime) {
        Jedis jedis = getJedis();
        long count = jedis.expireAt(key, unixTime);
        releaseJedis(jedis);
        return count;
    }

    /**
     * 查询key的过期时间
     * @return 以秒为单位的时间表示
     */
    public static long ttl(String key) {
        Jedis jedis = getJedis();
        long len = jedis.ttl(key);
        releaseJedis(jedis);
        return len;
    }

    /**
     * 取消对key过期时间的设置
     * @return 影响的记录数
     */
    public static long persist(String key) {
        Jedis jedis = getJedis();
        long count = jedis.persist(key);
        releaseJedis(jedis);
        return count;
    }

    /**
     * 删除keys对应的记录, 可以是多个key
     * @return 删除的记录数
     */
    public static long del(String... keys) {
        Jedis jedis = getJedis();
        long count = jedis.del(keys);
        releaseJedis(jedis);
        return count;
    }

    /**
     * 删除keys对应的记录, 可以是多个key
     * @return 删除的记录数
     */
    public static long del(byte[]... keys) {
        Jedis jedis = getJedis();
        long count = jedis.del(keys);
        releaseJedis(jedis);
        return count;
    }

    /**
     * 判断key是否存在
     */
    public static boolean exists(String key) {
        Jedis jedis = getJedis();
        boolean exists = jedis.exists(key);
        releaseJedis(jedis);
        return exists;
    }

    /**
     * 对List, Set, SortSet进行排序, 如果集合数据较大应避免使用这个方法
     * @return List<String> 全部记录
     */
    public static List<String> sort(String key) {
        Jedis jedis = getJedis();
        List<String> list = jedis.sort(key);
        releaseJedis(jedis);
        return list;
    }

    /**
     * 对List, Set, SortSet进行排序或limit
     * @param params 定义排序类型或limit的起止位置
     * @return List<String> 全部或部分记录
     */
    public static List<String> sort(String key, SortingParams params) {
        Jedis jedis = getJedis();
        List<String> list = jedis.sort(key, params);
        releaseJedis(jedis);
        return list;
    }

    /**
     * 返回指定key存储的类型
     * @param key
     * @return string|list|set|zset|hash
     */
    public static String type(String key) {
        Jedis jedis = getJedis();
        String type = jedis.type(key);
        releaseJedis(jedis);
        return type;
    }

    /**
     * 查找所有匹配给定的模式的键
     * @param pattern *多个 ?表示一个
     * @return
     */
    public Set<String> keys(String pattern) {
        Jedis jedis = getJedis();
        Set<String> set = jedis.keys(pattern);
        releaseJedis(jedis);
        return set;
    }
}
